package com.laoli.lab39;

import java.util.Random;
import java.util.concurrent.CompletableFuture;

/**
 * handle()示例：捕获异常并执行结果转换
 */
public class HandleDemo {
    public static void main(String[] args) throws InterruptedException {
        // 问：任务A、任务B各出一个随机数(1-10)，任务C计算这两个随机数的和？

        // 异步任务A
        CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> {
            /*Integer rndA = new Random().nextInt(10) + 1;
            System.out.println("rndA = " + rndA);
            return rndA;*/
            throw new RuntimeException("taskAException");
        });
        // 异步任务B
        CompletableFuture<Integer> taskB = CompletableFuture.supplyAsync(() -> {
            Integer rndB = new Random().nextInt(10) + 1;
            System.out.println("rndB = " + rndB);
            return rndB;
            //throw new RuntimeException("taskBException");
        });

        // 异步任务C
        CompletableFuture<Void> taskC = CompletableFuture.allOf(taskA, taskB);
        // 任务C聚合结果
        taskC.thenApply(result -> taskA.join() + taskB.join())
                // 异常处理和结果转换
                .handle((exResult,exception)->{//如果没有发生异常，exResult会存储前序任务执行结果，即taskA.join() + taskB.join()。并且exception为null。
                    if(exception!=null){
                        System.out.printf("【handle】exception：%s\n",exception);
                        return new RuntimeException("前序阶段执行异常"); // 返回异常执行结果，这里可以返回任意类型！（还记得上面讲过的使用exceptionnally处理异常的时候那个例子只能返回整数类型吗）
                    }
                    // 返回正常执行结果
                    return exResult;
                })
                // 任务C输出结果
                .thenAccept(result -> System.out.println("result = " + result));
        // 主线程休眠
        Thread.sleep(1000);
    }
}
